package 剑指offer;

import java.util.LinkedHashMap;
import java.util.Scanner;

/** 

* @author ：soulstones
* @version ：2019年9月30日 下午9:53:17 
* @Description：
* 
在一个字符串(0<=字符串长度<=10000，全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 
如果没有则返回 -1（需要区分大小写）.
*/
public class A34第一个只出现一次的字符 {
	public static int FirstNotRepeatingChar(String str) {
	if (str==null) 
		 return -1;

	//把character作为key,出现的次数time作为value
	//先判断map当中是否存在重复值
	//不存在，依次添加到map当中
	  //存在的话，把value取出来加上1再放回去
		LinkedHashMap <Character, Integer> map = new LinkedHashMap<Character, Integer>();
		        for(int i=0;i<str.length();i++){
		            if(map.containsKey(str.charAt(i))){
		                int time = map.get(str.charAt(i));
		                map.put(str.charAt(i), ++time);
		            }
		            else {
		                map.put(str.charAt(i), 1);
		            }
		        }
		        int pos = -1;  
		        int i=0;
		        for(;i<str.length();i++){
		            char c = str.charAt(i);
		            if (map.get(c) == 1) {
		                return i;
		            }
		        }
		        return pos;
    }
	
/*

主要还是hash，利用每个字母的ASCII码作hash来作为数组的index。
首先用一个58长度的数组来存储每个字母出现的次数，为什么是58呢，
主要是由于A-Z对应的ASCII码为65-90，a-z对应的ASCII码值为97-122，
而每个字母的index=int(word)-65，比如g=103-65=38，
而数组中具体记录的内容是该字母出现的次数，
最终遍历一遍字符串，找出第一个数组内容为1的字母就可以了，时间复杂度为O(n)
 */
		public static int solution(String str){
		    int[] words = new int[58];
		    for(int i = 0;i<str.length();i++){
		        words[((int)str.charAt(i))-65] += 1;
		    }
		    for(int i=0;i<str.length();i++){
		        if(words[((int)str.charAt(i))-65]==1)
		            return i;
		    }
		    return -1;
		}
	
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		int n = FirstNotRepeatingChar(s);
		System.out.println(n);
		int m = solution(s);
		System.out.println(m);
	}

}
